# OS
# 模块中关于文件/目录常用的函数
import os

# 1. os.getcwd() 用于返回当前工作目录。
from pprint import pprint
from datetime import datetime
from dateutil import parser

print(os.getcwd())

# 2. os.chdir(path) 用于改变当前工作目录到指定的路径。
os.chdir('../')  # D:\1-python-learning\python-learning\15.OS模块

print(os.getcwd())  # D:\1-python-learning\python-learning
# os.chdir('d:\\')
# print(os.getcwd())
# 3.listdir(path='.')返回path指定的文件夹包含的文件或文件夹的名字的列表。
pprint(os.listdir())
# 4.os.mkdir(path) 创建单层目录，如果该目录已存在抛出异常。
os.chdir('15.OS模块')
print(os.getcwd())

if os.path.isdir(r'./a') is False:
    os.mkdir(r'./a')
    os.mkdir(r'./a/b')

# 5.os.makedirs(path)用于递归创建多层目录，如果该目录已存在抛出异常。
try:
    os.makedirs(r'./c/b')
except FileExistsError as error:
    print('FileExistsError', error)
# 6.os.remove(path) 用于删除指定路径的文件。如果指定的路径是一个目录，将抛出 OSError 。
try:
    os.remove(r'./c/b')
except PermissionError as error:
    print('PermissionError', error)

# 7.os.rmdir(path) 用于删除单层目录。仅当这文件夹是空的才可以, 否则, 抛出 OSError 。
# try:
#     os.rmdir(r'./c')
#     # os.rmdir(r'./c/b')
# except OSError as error:
#     print('OSError', error)

# 8.os.removedirs(path) 递归删除目录，从子目录到父目录逐层尝试删除，遇到目录非空则抛出异常。
# try:
#     os.removedirs(r'./c/b')
# except OSError as error:
#     print('OSError', error)

# 9.os.rename(src, dst) 方法用于命名文件或目录，从 src 到 dst ，如果 dst 是一个存在的目录, 将抛出OSError 。
try:
    os.rename('c/b', 'c/rename')
except OSError as error:
    print('rename OSError', error)

# 10.os.system(command) 运行系统的shell命令（将字符串转化成命令）


# os.system('start .')  # 打开资源管理器
# os.system('calc')  # 打开计算器

"""
1. os.curdir 指代当前目录（ . ）
2. os.pardir 指代上一级目录（ .. ）
3. os.sep 输出操作系统特定的路径分隔符（win下为 \\ ，Linux下为 / ）
4. os.linesep 当前平台使用的行终止符（win下为 \r\n ，Linux下为 \n ）
5. os.name 指代当前使用的操作系统（包括：'mac'，'nt'）
"""
print('%r' % os.sep)  # '\\'
print('%r' % os.linesep)  # '\r\n'

print(os.name)  # nt

print(os.curdir)  # .
print(os.pardir)  # ..

"""
1. os.path.basename(path) 去掉目录路径，单独返回文件名
2. os.path.dirname(path) 去掉文件名，单独返回目录路径
3. os.path.join(path1[, path2[, ...]]) 将 path1 ， path2 各部分组合成一个路径名
4. os.path.split(path) 分割文件名与路径，返回 (f_path,f_name) 元组。如果完全使用目录，它会将最后一个目
录作为文件名分离，且不会判断文件或者目录是否存在。
5. os.path.splitext(path) 分离文件名与扩展名，返回 (f_path,f_name) 元组。
"""

# 返回文件名
print(os.path.basename(r'C:\test\learning.txt'))  # learning.txt
# 返回目录路径
print(os.path.dirname(r'C:\test\learning.txt'))  # C:\test
# 将目录和文件名合成一个路径
print(os.path.join('C:\\', 'test', 'learning.txt'))  # C:\test\learning.txt
# 分割文件名与路径
print(os.path.split(r'C:\test\learning.txt'))  # ('C:\\test', 'learning.txt')
# 分离文件名与扩展名
print(os.path.splitext(r'C:\test\learning.txt'))  # ('C:\\test\\learning', '.txt')

"""
1. os.path.getsize(file) 返回指定文件大小，单位是字节。
2. os.path.getatime(file) 返回指定文件最近的访问时间
3. os.path.getctime(file) 返回指定文件的创建时间
4. os.path.getmtime(file) 返回指定文件的最新的修改时间
5. 浮点型秒数，可用time模块的 gmtime() 或 localtime() 函数换算
"""
learning_size = os.path.getsize('./learning.txt')
print('learning_size', learning_size)  # 14
# 返回指定文件最近的访问时间
read_time = os.path.getatime('./learning.txt')
read_time_format = datetime.fromtimestamp(read_time)
print(type(read_time_format))  # <class 'datetime.datetime'>
print('最近的访问时间', read_time_format.strftime("%Y-%m-%d %H:%M:%S"))  # 2021-12-10 15:31:56
print(read_time_format.strftime("%Y-%m-%d %H:%M"))  # 2021-12-10 15:31

# 返回指定文件的创建时间
create_time = os.path.getctime('./learning.txt')
create_time_format = datetime.fromtimestamp(create_time)
print('创建时间', create_time_format.strftime("%Y-%m-%d %H:%M:%S"))
"""
1. os.path.exists(path) 判断指定路径（目录或文件）是否存在
2. os.path.isabs(path) 判断指定路径是否为绝对路径
3. os.path.isdir(path) 判断指定路径是否存在且是一个目录
4. os.path.isfile(path) 判断指定路径是否存在且是一个文件
5. os.path.islink(path) 判断指定路径是否存在且是一个符号链接
6. os.path.ismount(path) 判断指定路径是否存在且是一个悬挂点
7. os.path.samefile(path1,path2) 判断path1和path2两个路径是否指向同一个文件
"""
print('exists是否存在', os.path.exists(r'd:/1-python-learning'))  # True
print('isabs绝对路径', os.path.isabs(r'd:/1-python-learning'))  # True
print('isdir是否目录', os.path.isdir(r'd:/1-python-learning'))  # True
print('islink快捷方式', os.path.islink(r'd:/1-python-learning'))  # False
print('isabs绝对路径', os.path.ismount(r'd:/1-python-learning'))  # False
print('ismount悬挂点', os.path.ismount(r'd:/'))  # True 悬挂点
